package com.way.designpatterncodepratice.template;

/**
 * @author liangliwei 80551025
 * @description 牛奶制作模板 抽象类 可以有抽象的方法 也可以有具体方法
 * @date 2020-06-19
 */
public abstract class MilkMake {


    //钩子函数 可实现 可不实现
    public boolean ifAddIngredient() {
        //不重写的时候就是默认返回 true 添加配料
        return true;
    }

    public MilkMake() {
    }

    //倒入纯牛奶
    void pourPureMilk(){
        System.out.println("倒入纯牛奶");
    }

    //加入配料
    abstract void ingredient();


    //杀菌
    void sterilize(){
        System.out.println("杀菌牛奶");
    }

    //搅拌
    void stir(){
        System.out.println("搅拌牛奶");
    }

    //包装
    void wrap(){
        System.out.println("包装牛奶");
    }


    /**
     * 一般模板方法加上final 防止子类重写模板方法
     */
    final void make(){
        pourPureMilk();
        if(ifAddIngredient()){
            ingredient();
        }
        sterilize();
        stir();
        wrap();
    }
}
